package scala.day02

object Demo06List {
  def main(args:Array[String]):Unit = {
    /**
      * list相当于java中的ArrayList
      * scala默认的List 是不可变的
      */
    val list = List(1,2,3,4,5,6,7,8,9,1)

    /**
      * List中的常用方法
      * 下列所有的方法都不会改变原集合
      */
    println(list(1))//通过下标取数
    println(list.mkString(","))//拼接成字符串
    println(list.head)//取第一个元素
    println(list.last)//取最后一个元素
    println(list.take(3))//取前几个元素
    println(list.size)
    println(list.length)//长度
    println(list.distinct)//去重
    println(list.reverse)//反转集合，返回一个新的集合
    println(list.tail)//返回不包含第一个元素的所有的元素的集合
    println(list.min)//取最小值
    println(list.max)//取最大值
    println(list.sum)//求和
    /**
      * 高级方法
      */
    /**
      * map 函数
      * 将集合中的元素一个一个传给后面的函数，最终返回一个新的集合
      * 数据行数不变，原来是多少行处理完还是多少行
      */
    val list1: List[Int] = list.map((i:Int)=>i*2)
    println(list1)
    //取出所有的奇数
    /**
      * filter函数，对集合中的元素进行过滤
      *
      * 后面的函数返回true 保留数据
      * 后面的函数返回false 过滤数据
      *
      * 集合的数据会减少
      */
    val list2: List[Int] = list.filter((i:Int)=>i%2==1)
    println(list2)

    /**
      * sort函数
      *
      * sortBy：通过某一个字段进行排序，默认是升序
      * sortWith:传入一个比较规则进行排序
      */
    val list3: List[Int] = list.sortBy((i:Int) => -i)//降序
    println(list3)
    val list4: List[Int] = list.sortBy((i: Int) => i) //升序
    println(list4)
    val list5: List[Int] = list.sortWith((i:Int,j:Int) => i>j)//降序
    println(list5)
    val list6: List[Int] = list.sortWith((i:Int,j:Int) => j<j)//升序
    println(list6)

    /**
      * flatMap函数
      * 将集合中的元素按照一个分隔方法分隔成多行
      * 一行转化为多行
      *
      * 需要一个返回值为数组或者集合的函数
      *
      */
    val strs = List("java,spark,hadoop,java", "hive,scala,hbase", "hive,scala,hbase", "flume,sqoop")
    val words: List[String] = strs.flatMap((line:String) => line.split(","))
    println(words)

    /**
      * 结果数据结果不变---map
      * 结果数据变少---filter
      * 结果数据变多---flatMap
      */
    /**
      * groupBy函数
      * 通过某一个列进行分组，将同一个列分到同一个组内
      */
    val map: Map[String, List[String]] = words.groupBy((word:String) =>word)
    for (elem <- map) {
      println(elem)
    }

    /**
      * 遍历
      * foreach:函数，遍历集合
      * 将集合中的元素一个一个传递给后面的函数，没有返回值
      */
    list.foreach((i:Int)=>println(i))
    println("*"*100)
    list.foreach(i=>println(i))
    println("*"*100)
    list.foreach(println(_))
    println("*"*100)
    //多态
    list.foreach(println)
  }
}
